package cn.ronghuanet.interceptor;

import cn.ronghuanet.annotation.RonghuaPermission;
import cn.ronghuanet.login.constant.LoginConstant;
import cn.ronghuanet.org.domain.Employee;
import cn.ronghuanet.permission.service.IPermissionScanService;
import cn.ronghuanet.permission.service.IPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;

/**
 * 认证授权拦截器
 * 1 登陆拦截 如果用户没有登陆就来访问某个资源,进入拦截器
 * 2 权限拦截(鉴权) : 当用户访问某一个需要权限才能访问的资源时,判断当前登陆用户拥不拥有访问这个资源的权限,如果有权限就放行,如果没有就拦截
 *      分析:
 *         2.1 获取访问这个资源所需要的权限
 *         2.2 如果这个权限不存在,就说明访问这个资源不需要权限的话,就直接放行
 *         2.3 如果权限存在,就说明访问这个资源需要权限  DepartmentController:list
 *         2.4 获取当前登陆用户他拥有的所有的权限  [RoleController:list,RoleController:getById,DepartmentController:list]
 *         2.5 判断资源所需要的权限,在不在登录用户他拥有的权限里面
 *              如果包含资源所需要的权限,就放行
 *              如果不包含资源所需要的权限,就要拦截
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private IPermissionService permissionService;

    /**
     * 前置拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1 登陆拦截
        // 1.1 从请求通中获取token
        /*String token = request.getHeader("token");

        // 1.2 根据token作为key去LoginMap获取当前登陆用户
        Employee loginUser = (Employee)LoginConstant.loginMap.get(token);

        // 1.3 判断当前登陆用户是否为空,为空就说明未登录,就要拦截  否则就放行
        if(Objects.isNull(loginUser)){
            // 向前端传递错误信息
            response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
            return false;   // 拦截
        }*/

        // 2 权限拦截
       /* if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod)handler;
            Method method = handlerMethod.getMethod();
            // 2.1 判断当前资源需不需要权限来访问
            RonghuaPermission annotation = method.getAnnotation(RonghuaPermission.class);
            if(Objects.isNull(annotation)){
                // 注解为空,说明当前方法不需要权限就能直接访问 放行
                return true;
            }
            // 2.2 获取访问这个资源所需要的权限   类名:方法名
            String sn = method.getDeclaringClass().getSimpleName()+":"+method.getName();

            // 2.3 获取当前登陆用户他拥有的所有的权限 - 只需要知道当前登陆用户拥有的权限sn有哪一些就可以了,不需要知道权限的所有信息
            List<String> sns = permissionService.getPermissionSnsByLoginUserId(loginUser.getId());

            // 2.4 判断资源所需要的权限,在不在登录用户他拥有的权限里面
            if(!sns.contains(sn)){
                // 不存在
                response.getWriter().println("{\"success\":false,\"message\":\"noPermission\"}");   // 向前端响应错误信息
                return false;       // 拦截
            }
        }*/

        return true;    // 放行
    }
}
